import { uploadFileAliOss } from './alioss'
import api from '../api'

/**
 * 上传地址
 * 旧：/common/ali/aliyun/sts/assumerole
 * 新：/common/file/authorize
 *
 * 返回结果里有type字段，指明上传方式
 * type=local,　url是上传地址
 * type=aliyun  是阿里云上传方式
 * */
export const uploadAuthentication = () => {
    return api.get('/common/file/authorize').then((res) => {
        return res[0]
    })
}

export function initClint() {
    return new Promise((resolve, reject) => {
        let config = {
            region: '',
            bucket: '',
            accessKeyId: '',
            accessKeySecret: '',
        }
        uploadAuthentication()
            .then((res) => {
                // 阿里云上传方式
                if (res.type === 'aliyun') {
                    config.region = res.region
                    config.bucket = res.bucket
                    config.accessKeyId = res.keyid
                    config.accessKeySecret = res.keysecret
                    config.policy = res.policy
                    config.signature = res.signature
                    config.stsToken = res.token
                    resolve(config)
                } else if (res.type === 'local') {
                    // 其它上传方式
                    resolve(res)
                }
            })
            .catch((e) => {
                reject(e)
            })
    })
}

// 阿里云上传方式
export function upload(aliOSS, file, progress) {
    return new Promise((resolve, reject) => {
        return uploadFileAliOss({
            filePath: file,
            aliOSS,
        })
            .then((res) => {
                const { data } = res
                resolve(data)
            })
            .catch((e) => {
                console.error('---阿里云上传失败---', e)
                reject(e)
            })
    })
}

// 其它上传方式
export function localUpload(params, file, progress) {
    const formdata = new FormData()
    formdata.append('file', file)
    return api
        .post(`${params.url}`, formdata)
        .then((res) => {
            console.log('---其它上传方式---', res)
            if (res.length > 0) {
                const url = res[0].fileUrl
                return {
                    url,
                    // type: api.fileType(url),
                }
            } else {
                return null
            }
        })
        .catch((e) => {
            console.log('---其它上传方式失败 catch---', e)
        })
}

/**
 * 文件上传至阿里云oss
 * @param {File} file file文件
 * @param {Function} progress 上传进度事件
 * @return {Promise} {url}
 * */
export default (file, progress) => {
    if (!progress || typeof progress !== 'function') {
        progress = function () {}
    }
    return initClint().then((resp) => {
        console.log('---获取文件上传方式---', resp)
        if (resp.url && resp.type === 'local') {
            return localUpload(resp, file, progress)
        } else {
            return upload(resp, file, progress)
        }
    })
}
